Python:来自多个列表的随机数,不重复

您所在的位置:网站首页 python 随机输出1-n之间的不重复整数 Python:来自多个列表的随机数,不重复

Python:来自多个列表的随机数,不重复

#Python:来自多个列表的随机数,不重复| 来源: 网络整理| 查看: 265

当你做这样的事情

zip([1,2,3,4],[5,6,7,8])

结果输出仅为对。

[(1, 5), (2, 6), (3, 7), (4, 8)]

所以你不可能得到像(1,6)或(2,5)这样的东西。如果你真的想做这样的事情,你应该做一个笛卡儿的产品,就像这样:

itertools.product([1,2,3,4],[5,6,7,8])

这会给你所有可能的组合。例如:

>>> random.choice(list(itertools.product([1,2,3,4],[5,6,7,8]))) (1, 6)

然而,如果你真的尝试一个15路笛卡儿乘积,其中有一个或两个以上的元素集,那么它将要构造的集合将是巨大的,并且可能不适合记忆。

此外,如果集合重叠,则必须遍历并执行某种筛选,以丢弃多次选择相同数字的选项。

获得没有重复和从集合中选择的每个元素的随机列表的最简单方法是逐个元素地选择:

def pick_unique_elements_from_lists(*args): while True: result = [] already_chosen = set() for arg in args: valid_choices = [ n for n in arg if n not in already_chosen ] if not valid_choices: continue choice = random.choice(valid_choices) result.append(choice) already_chosen.add(choice) return tuple(result)

然而,虽然这里的选择是随机的,但我们可能想知道它们是否都是随机的。例如,假设我们想从1,2中选择第一个元素的4元组,从1,3选择第二个元组,从1,4选择第三个元组,从1,5选择第四个元组。

(1,3,4,5)(2,1,4,5)(2,3,1,5)(2,3,4,1)

H 114(2,3,4,5)H 215F 216

因此,如果我们是随机的均匀抽样,我们预计元组的第一个元素是大约80%的时间。然而,这不是pick_unique_elements_from_lists函数所做的;如果您尝试它,您会发现它会给您以1开始的元组(大约50%的时间)。

pick_unique_elements_from_lists函数的另一个缺点是,如果给它一个参数序列,就不可能从中选择任何不同元素的元组。

[1, 2], [2, 3], [1, 3]

然后,它就会永远旋转,试图得到一个有效的样本。

如果你需要均匀取样,我可以看到三种方法:

实际上列举了你能得到的每一个可能的元组,然后随机选择其中之一。确实接受/拒绝整个数字宇宙中随机序列的抽样。提出了一个有效样本的巧妙双射枚举,并利用它构造了一个干净的采样算法。我不知道这会有多难,尽管我警告您,听起来像这样的问题通常会非常困难。

下面是一个如何进行接受/拒绝方法的示例:

def accept_reject_from_lists(*args): universe = set().union(*args) found = False while not found: candidate = random.sample(universe, len(args)) found = True for i in range(len(candidate)): if candidate[i] not in args[i]: found = False break return tuple(candidate)

这仍然有一个缺点,如果没有满足条件的元组,它将进入无限循环,而且也可能需要非常长的时间,这取决于列表之间有多少重叠,但从好的方面看,如果给它一个很大的解决问题,它不会耗尽内存和崩溃。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3